import { defineStore } from "pinia";
import request from '@/utils/request'
import { CartItem } from '@/types/cart'
import { ApiRes } from '@/types/data'

const useCartStore = defineStore('cart', {
  // 状态
  state() {
    return {
      list: [] as CartItem[]// 购物车数组
    }
  },
  // 计算
  getters: {
    // 基于原有的数据，进行筛选，筛选出有效的购物车列表
    // 有效购物车列表 isEffective:true
    // 计算有效商品列表 isEffective = true  filter
    effectiveList(): CartItem[] {
      return this.list.filter((item) => item.isEffective && item.stock > 0)
    },
    // 有效商品的数量
    effectiveListCounts(): number {
      const total = this.effectiveList.reduce((sum, item, index) => {
        return sum + item.count
      }, 0)
      return total
    },
    // 有效商品的总价
    effectiveListPrice(): string {
      const totalPrice = this.effectiveList.reduce((sum, item, index) => {
        return sum + item.count * Number(item.nowPrice)
      }, 0)
      return totalPrice.toFixed(2)
    },
    // 已选择的列表
    selectedList(): CartItem[] {
      return this.effectiveList.filter((item) => item.selected)
    },
    // 已选择的商品总数
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选择的列表总价
    selectedListPrice(): string {
      return this.selectedList
        .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
        .toFixed(2)
    }

  },
  // 方法

  actions: {
    // 获取购物车列表
    async getCartList() {
      const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
      // console.log(res.data);
      this.list = res.data.result
    },

    // 加入购物车
    async addCart(data: { skuId: string; count: number }) {
      await request.post('/member/cart', data)
      // 重新获取购物车数据
      this.getCartList()
    },
    // 删除购物车
    async deleteCart(skuId: string[]) {
      await request.delete('/member/cart', {
        // params 中传递的参数，往地址栏里拼接的
        // data 中传递的参数，往请求体中包装的
        // delete 支持在请求体里传参
        data: {
          ids: skuId
        }

      })
      // 重新获取购物车数据
      this.getCartList()
    },
    // 修改商品的接口
    async updateCart(
      skuId: string,
      data: { selected?: boolean; count?: number }
    ) {
      await request.put(`/member/cart/${skuId}`, data)
      // 重新获取最新购物车列表
      this.getCartList()
    },
    // 清空购物车
    clearCart() {
      // 退出登录需清空购物车
      this.list = [];
    },

  }
});

export default useCartStore;